From d4f08efd57207b24837a5c2d8833139acb9005ad Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 9 Sep 2010 01:45:54 +0200 Subject: [PATCH] API: add gdk_cairo_get_clip_rectangle() convenience API --- docs/reference/gdk/gdk3-sections.txt | 1 + gdk/gdk.symbols | 1 + gdk/gdkcairo.c | 39 ++++++++++++++++++++++++++++ gdk/gdkcairo.h | 2 ++ 4 files changed, 43 insertions(+) diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index 0b57d32250..d03fa857d0 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -594,6 +594,7 @@ gdk_pango_context_get_for_screen cairo_interaction gdk_window_create_similar_surface gdk_cairo_create +gdk_cairo_get_clip_rectangle gdk_cairo_set_source_color gdk_cairo_set_source_pixbuf gdk_cairo_set_source_window diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index a5ec76ed13..cc9dbcf119 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -288,6 +288,7 @@ gdk_visual_type_get_type G_GNUC_CONST #if IN_FILE(__GDK_CAIRO_C__) gdk_cairo_create gdk_cairo_reset_clip +gdk_cairo_get_clip_rectangle gdk_cairo_set_source_color gdk_cairo_set_source_pixbuf gdk_cairo_set_source_window diff --git a/gdk/gdkcairo.c b/gdk/gdkcairo.c index 7a7fc839cf..3ef1ce2b34 100644 --- a/gdk/gdkcairo.c +++ b/gdk/gdkcairo.c @@ -89,6 +89,45 @@ gdk_cairo_reset_clip (cairo_t *cr, GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_clip (drawable, cr); } +/** + * gdk_cairo_get_clip_rectangle: + * @cr: a cairo context + * @rect: (out) (allow-none): return location for the clip, or %NULL + * + * This is a convenience function around cairo_clip_extents(). It rounds + * the clip extents to integer coordinates and returns a boolean + * indicating if a clip area exists. + * + * Returns: %TRUE if a clip rectangle exists, %FALSE if all of @cr is + * clipped and all drawing can be skipped. + **/ +gboolean +gdk_cairo_get_clip_rectangle (cairo_t *cr, + GdkRectangle *rect) +{ + double x1, y1, x2, y2; + gboolean clip_exists; + + cairo_clip_extents (cr, &x1, &y1, &x2, &y2); + + clip_exists = x1 < x2 && y1 < y2; + + if (rect) + { + x1 = floor (x1); + y1 = floor (y1); + x2 = ceil (x2); + y2 = ceil (y2); + + rect->x = CLAMP (x1, G_MININT, G_MAXINT); + rect->y = CLAMP (y1, G_MININT, G_MAXINT); + rect->width = CLAMP (x2 - x1, G_MININT, G_MAXINT); + rect->height = CLAMP (y2 - y1, G_MININT, G_MAXINT); + } + + return clip_exists; +} + /** * gdk_cairo_set_source_color: * @cr: a #cairo_t diff --git a/gdk/gdkcairo.h b/gdk/gdkcairo.h index 99afc064f8..6da20007c4 100644 --- a/gdk/gdkcairo.h +++ b/gdk/gdkcairo.h @@ -33,6 +33,8 @@ G_BEGIN_DECLS cairo_t *gdk_cairo_create (GdkDrawable *drawable); void gdk_cairo_reset_clip (cairo_t *cr, GdkDrawable *drawable); +gboolean gdk_cairo_get_clip_rectangle(cairo_t *cr, + GdkRectangle *rect); void gdk_cairo_set_source_color (cairo_t *cr, const GdkColor *color); -- 2.30.2